package cn.jbit.generatedbdata.generateData;


import cn.jbit.generatedbdata.GenerateAllData;
import cn.jbit.generatedbdata.tools.DBUtil;
import cn.jbit.generatedbdata.tools.MyDateUtil;
import cn.jbit.generatedbdata.tools.StringUtil;


import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/**
 * 向MySQL 库 rt_ycak 中 machine_consume_detail 机器消费订单明细增量表生产数据
 */
public class GenerateRtYcakMachineConsumerDetailData extends Thread {

    @Override
    public void run() {
        //测试线程代码
//        while(true){
//            try {
//                System.out.println("向machine_consume_detail表中生产数据");
//                Thread.sleep(200);
//            } catch (InterruptedException e) {
//                e.printStackTrace();
//            }
//        }

        //真正生产数据代码
        GenerateData();
    }

    private void GenerateData() {
        System.out.println("线程名: "+getName()+" 运行，开始向 rt_yack库中的 machine_consume_detail 表生产数据");

        Connection conn = null;
        String sql = null;
        List<Object[]> params = null;
        try {
            //1.获取数据库 rt_ycak 连接
            conn = DBUtil.getRTYcakConnection();

            //2.先将表 song 数据清空
            DBUtil.deleteTblData(conn, "machine_consume_detail");

            /**
             * 3.读取文件中的数据
             * 获取日志文件数据路径:
             * GenerateAllDBData.class.getClassLoader().getResource().getPath 获取的是编译后classes文件夹的根路径
             *
             * 注意：这里是循环读取此文件 ,生产数据时，每隔1s生产200条即可
             */
            while(true){
                InputStream in= GenerateAllData.class.getClassLoader().getResourceAsStream("rt_ycak_machine_consume_detail.txt");
                BufferedReader br=new BufferedReader(new InputStreamReader(in));
                String line=br.readLine();
                //4.准备SQL语句
                sql = "INSERT INTO rt_ycak.machine_consume_detail (" +
                        "mid,p_type,m_type,pkg_id,pkg_name,amount,consum_id,order_id,trade_no,action_time," +
                        "uid,nickname,activity_id,activity_name,coupon_type,coupon_type_name,pkg_price,pkg_discount,order_type,bill_date) " +
                        "VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";

                //5.准备列表，每满1000条数据就批量向MySQL对应表中插入数据
                params = new ArrayList<>();
                int flag = 0;
                while(line!=null){
                    System.out.println("生成订单数据》》》》》"+line);
                    //解析每一行line
                    String[] split = line.split("\\^");
                    params.add(new Object[]{
                            StringUtil.convertStringtoInt(StringUtil.strTrimStartAndEnd(split[1])),//mid
                            StringUtil.convertStringtoInt(StringUtil.strTrimStartAndEnd(split[2])),//p_type
                            StringUtil.convertStringtoInt(StringUtil.strTrimStartAndEnd(split[3])),//m_type
                            StringUtil.convertStringtoInt(StringUtil.strTrimStartAndEnd(split[4])),//pkg_id
                            StringUtil.strTrimStartAndEnd(split[5]),//pkg_name
                            StringUtil.convertStringtoInt(StringUtil.strTrimStartAndEnd(split[6])),//amount
                            StringUtil.strTrimStartAndEnd(split[7]),//consum_id
                            StringUtil.strTrimStartAndEnd(split[8]),//order_id
                            StringUtil.strTrimStartAndEnd(split[9]),//trade_no
                            StringUtil.strTrimStartAndEnd(MyDateUtil.getCurrentTimeStamp()),//action_time
                            StringUtil.convertStringtoInt(StringUtil.strTrimStartAndEnd(split[11])),//uid
                            StringUtil.strTrimStartAndEnd(split[12]),//nickname
                            StringUtil.convertStringtoInt(StringUtil.strTrimStartAndEnd(split[13])),//activity_id
                            StringUtil.strTrimStartAndEnd(split[14]),//activity_name
                            StringUtil.convertStringtoInt(StringUtil.strTrimStartAndEnd(split[15])),//coupon_type
                            StringUtil.strTrimStartAndEnd(split[16]),//coupon_type_name
                            StringUtil.convertStringtoInt(StringUtil.strTrimStartAndEnd(split[17])),//pkg_price
                            StringUtil.convertStringtoInt(StringUtil.strTrimStartAndEnd(split[18])),//pkg_discount
                            StringUtil.convertStringtoInt(StringUtil.strTrimStartAndEnd(split[19])),//order_type
                            StringUtil.strTrimStartAndEnd(MyDateUtil.getCurrentDate())//bill_date
                    });
                    flag++;
                    if(flag == 200){
                        //3.向表中生产数据
                        DBUtil.executeBatch(conn, sql, params);
                        //清空计数与集合
                        flag = 0;
                        params.clear();
                        Thread.sleep(2000);//每2s生产200条数据
                    }

                    line=br.readLine();
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            try {//将最后剩余不够200条的数据插入到数据库表中
                DBUtil.executeBatch(conn, sql, params);
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            System.out.println("线程名: "+getName()+" 运行，向 rt_ycak 库中的 machine_consume_detail 表生产数据完成");
        }
    }
}